;
}
}
-
}
}
ogue_t* ogp;
time_t time;
struct tm tm;
- char tbuf[32];
+// char tbuf[32];
/* reset the index counter */
waypt_out_count = 0;
/* output prologue lines, if any. */
QUEUE_FOR_EACH(&xcsv_file.prologue, elem, tmp) {
- char* cout, *ctmp;
ogp = (ogue_t*) elem;
+ // If the XCSV description contains weird characters (like sportsim)
+ // this is where they get lost.
+ QString cout = ogp->val;
- cout = xstrdup((ogp->val) ? ogp->val : "");
+ // Don't do potentially expensive replacements if token prefix
+ // isn't present;
+ if (cout.contains("__")) {
+ cout.replace("__FILE__", xcsv_file.fname);
+ cout.replace("__VERSION__", time == 0 ? "" : gpsbabel_version);
- while ((ctmp = strsub(cout, "__FILE__", xcsv_file.fname))) {
- xfree(cout);
- cout = ctmp;
- }
+ QDateTime dt = QDateTime::fromTime_t(time);
+ dt = dt.toTimeSpec(Qt::UTC);
- while ((ctmp = strsub(cout, "__VERSION__", (time == 0) ? "" : gpsbabel_version))) {
- xfree(cout);
- cout = ctmp;
- }
+ QString dts = dt.toString("ddd MMM dd hh:mm:ss yyyy");
+ cout.replace("__DATE_AND_TIME__", dts);
- while (strstr(cout, "__DATE__")) {
- strftime(tbuf, sizeof(tbuf), "%m/%d/%Y", &tm);
- ctmp = strsub(cout, "__DATE__", tbuf);
- xfree(cout);
- cout = ctmp;
- }
+ QString d = dt.toString("MM/dd/yyyy");
+ cout.replace("__DATE__", d);
- while (strstr(cout, "__TIME__")) {
- strftime(tbuf, sizeof(tbuf), "%H:%S:%M", &tm);
- ctmp = strsub(cout, "__TIME__", tbuf);
- xfree(cout);
- cout = ctmp;
+ QString t = dt.toString("hh:mm:ss");
+ cout.replace("__TIME__", t);
}
-
- while (strstr(cout, "__DATE_AND_TIME__")) {
- strftime(tbuf, sizeof(tbuf), "%a %b %d %H:%M:%S %Y", &tm);
- ctmp = strsub(cout, "__DATE_AND_TIME__", tbuf);
- xfree(cout);
- cout = ctmp;
- }
-
- gbfprintf(xcsv_file.xcsvfp, "%s", cout);
- xfree(cout);
+ gbfprintf(xcsv_file.xcsvfp, "%s", CSTR(cout));
gbfprintf(xcsv_file.xcsvfp, "%s", xcsv_file.record_delimiter);
}
int str_match(const char* str, const char* match);
int case_ignore_str_match(const char* str, const char* match);
-char* strenquote(const char* str, const char quot_char);
+QString strenquote(const QString& str, const QChar quot_char);
char* strsub(const char* s, const char* search, const char* replace);
char* gstrsub(const char* s, const char* search, const char* replace);
--- /dev/null
+# gpsbabel XCSV style file
+#
+# Format: Sportsim track files
+# Author: Olaf Klein
+# Date: 07/05/2006
+#
+DESCRIPTION Sportsim track files (part of zipped .ssz files)
+EXTENSION txt
+DATATYPE TRACK
+
+#
+# FILE LAYOUT DEFINITIIONS:
+#
+FIELD_DELIMITER SEMICOLON
+RECORD_DELIMITER CRNEWLINE
+BADCHARS TAB
+
+#
+# FILE HEADER
+#
+PROLOGUE SportsimVersion:01
+PROLOGUE \#Sportsim TrackFile
+
+#
+# INDIVIDUAL DATA FIELDS:
+#
+IFIELD INDEX, "", "%05d"
+IFIELD CONSTANT, "0", "%s"
+IFIELD LAT_DECIMAL, "", "%f"
+IFIELD LON_DECIMAL, "", "%f"
+IFIELD ALT_FEET, "", "%.f"
+IFIELD TIMET_TIME, "", "%ld"
+IFIELD CONSTANT, ";", "%s"
+++ /dev/null
-# gpsbabel XCSV style file
-#
-# Format: Sportsim track files
-# Author: Olaf Klein
-# Date: 07/05/2006
-#
-DESCRIPTION Sportsim track files (part of zipped .ssz files)
-EXTENSION txt
-DATATYPE TRACK
-
-#
-# FILE LAYOUT DEFINITIIONS:
-#
-FIELD_DELIMITER SEMICOLON
-RECORD_DELIMITER CRNEWLINE
-BADCHARS TAB
-
-#
-# FILE HEADER
-#
-PROLOGUE SportsimVersion:01
-PROLOGUE \#Sportsim TrackFile
-
-#
-# INDIVIDUAL DATA FIELDS:
-#
-IFIELD INDEX, "", "%05d"
-IFIELD CONSTANT, "0", "%s"
-IFIELD LAT_DECIMAL, "", "%f"
-IFIELD LON_DECIMAL, "", "%f"
-IFIELD ALT_FEET, "", "%.f"
-IFIELD TIMET_TIME, "", "%ld"
-IFIELD CONSTANT, ";", "%s"
--- /dev/null
+#
+# Sportsim style-sheet
+#
+rm -f ${TMPDIR}/sportsim*
+gpsbabel -i gpx -f ${REFERENCE}/expertgps.gpx -x nuketypes,waypoints,routes -o sportsim -F ${TMPDIR}/sportsim.txt
+compare ${REFERENCE}/track/sportsim-sample.txt ${TMPDIR}/sportsim.txt
+++ /dev/null
-#
-# Sportsim style-sheet
-#
-rm -f ${TMPDIR}/sportsim*
-gpsbabel -i gpx -f ${REFERENCE}/expertgps.gpx -x nuketypes,waypoints,routes -o sportsim -F ${TMPDIR}/sportsim.txt
-compare ${REFERENCE}/track/sportsim-sample.txt ${TMPDIR}/sportsim.txt
gt_get_mps_grid_longname(unicsv_grid_idx, MYNAME));
}
-static void
-unicsv_print_str(const char* str)
-{
- if (str && *str) {
- char* cout, *cx;
-
- cout = strenquote(str, UNICSV_QUOT_CHAR);
-
- while ((cx = strstr(cout, "\r\n"))) {
- memmove(cx, cx + 1, strlen(cx));
- *cx++ = ',';
- lrtrim(cx);
- }
- while ((cx = strchr(cout, '\r'))) {
- *cx++ = ',';
- lrtrim(cx);
- }
- while ((cx = strchr(cout, '\n'))) {
- *cx++ = ',';
- lrtrim(cx);
- }
-
- gbfprintf(fout, "%s%s", unicsv_fieldsep, cout);
- xfree(cout);
- } else {
- gbfputs(unicsv_fieldsep, fout);
- }
-}
-
static void
unicsv_print_str(const QString& s)
{
- char* t = xstrdup(s.toUtf8().data());
- unicsv_print_str(t);
- xfree(t);
+ gbfputs(unicsv_fieldsep, fout);
+ QString t;
+ if (!s.isEmpty()) {
+ t = strenquote(s, UNICSV_QUOT_CHAR);
+ // I'm not sure these three replacements are necessary; they're just a
+ // slavish re-implementation of (what I think) the original C code
+ // was doing.
+ t.replace("\r\n", ",");
+ t.replace("\r", ",");
+ t.replace("\n", ",");
+ }
+ gbfputs(t.trimmed(), fout);
}
#if NEW_STRINGS
break;
case grid_lat_lon_dms: {
- char* sep, *tmp;
+ char* sep;
+ QString tmp;
cout = pretty_deg_format(lat, lon, 's', unicsv_fieldsep, 0);
sep = strchr(cout, ',');
*sep = '\0';
tmp = strenquote(cout, UNICSV_QUOT_CHAR);
- gbfprintf(fout, "%s%s", tmp, unicsv_fieldsep);
- xfree(tmp);
+ gbfprintf(fout, "%s%s", CSTR(tmp), unicsv_fieldsep);
tmp = strenquote(sep+1, UNICSV_QUOT_CHAR);
gbfputs(tmp, fout);
- xfree(tmp);
}
break;
return res;
}
-char*
-strenquote(const char* str, const char quot_char)
-{
- int len;
- const char* cin;
- char* cout;
- char* tmp;
-
- if (str == NULL) {
- cin = "";
- } else {
- cin = (char*)str;
- }
-
- len = strlen(cin);
- cout = tmp = (char*) xmalloc((len * 2) + 3);
-
- *cout++ = quot_char;
- while (*cin) {
- *cout++ = *cin;
- if (*cin++ == quot_char) {
- *cout++ = quot_char;
- }
- }
- *cout++ = quot_char;
- *cout = '\0';
-
- cout = xstrdup(tmp);
- xfree(tmp);
- return cout;
+// for ruote_char = "
+// make str = blank into nothing
+// make str = foo into "foo"
+// make str = foo"bar into "foo""bar"
+// No, that doesn't seem obvious to me, either...
+
+QString
+strenquote(const QString& str, const QChar quot_char)
+{
+ QString replacement = QString("%1%1").arg(quot_char);
+ QString t = str;
+ t.replace(quot_char, replacement);
+ QString r = quot_char + t + quot_char;
+ return r;
}
void
249, 249, 249, 249, 249, 249, 249, 249, 249, 249,
249, 249, 249, 249, 249, 249
};
- register int hval = len;
+ register int hval = (int)len;
switch (hval)
{
xol_write_string(const char* name, const char* str)
{
if (str && *str) {
- char* temp = strenquote(str, '"');
- gbfprintf(fout, " %s=%s", name, temp);
- xfree(temp);
+ QString temp = strenquote(str, '"');
+ gbfprintf(fout, " %s=%s", name, CSTR(temp));
}
}